package com.example.demo.util;

import org.jsoup.nodes.Element;

import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import java.io.IOException;


/**
 * 解析邮件的工具类
 *
 */
public class MailAnalyzer {

    private MailAnalyzer() {
    }

    /**
     * 解析邮件
     *
     * @param html
     * @return
     */
    public static Object analyse(String html) {
        System.out.println("开始解析html邮件：\n" + html);

        return "";
    }

    /**
     * 找到指定上层元素
     *
     * @param current  当前节点
     * @param nodeName 要寻找的节点名
     * @param depth    寻找深度
     * @return 找到的节点
     */
    private static Element getUpperElement(Element current, String nodeName, Integer depth) {
        Element expectedElement = current;
        // 没有找到标签  或者  深度不够  都继续向上找
        while (!expectedElement.nodeName().equals(nodeName) || --depth != 0) {
            expectedElement = expectedElement.parent();
        }
        return expectedElement;
    }

    /**
     * 寻找上层最近的tr
     *
     * @param element 当前节点
     * @return 最近的上级tr
     */
    private static Element getUpperTr(Element element) {
        return getUpperElement(element, "tr", 1);
    }

    /**
     * 获得邮件html内容
     *
     * @param part    邮件体
     * @param content 存储邮件Html内容的字符串
     * @throws MessagingException
     * @throws IOException
     */
    public static void getMailHtmlContent(Part part, StringBuilder content) throws MessagingException, IOException {
        //如果是文本类型的附件，通过getContent方法可以取到文本内容，但这不是我们需要的结果，所以在这里要做判断
        boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
        if (part.isMimeType("text/html") && !isContainTextAttach) {
            content.append(part.getContent().toString());
        } else if (part.isMimeType("message/rfc822")) {
            getMailHtmlContent((Part) part.getContent(), content);
        } else if (part.isMimeType("multipart/*")) {
            Multipart multipart = (Multipart) part.getContent();
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                if (bodyPart.isMimeType("text/html")) {
                    getMailHtmlContent(bodyPart, content);
                }
            }
        }
    }

    /**
     * 获得邮件text内容
     *
     * @param part    邮件体
     * @param content 存储邮件Html内容的字符串
     * @throws MessagingException
     * @throws IOException
     */
    public static void getMailTextContent(Part part, StringBuilder content) throws MessagingException, IOException {
        //如果是文本类型的附件，通过getContent方法可以取到文本内容，但这不是我们需要的结果，所以在这里要做判断
        boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
        if (part.isMimeType("text/plain") && !isContainTextAttach) {
            content.append(part.getContent().toString());
        } else if (part.isMimeType("message/rfc822")) {
            getMailTextContent((Part) part.getContent(), content);
        } else if (part.isMimeType("multipart/*")) {
            Multipart multipart = (Multipart) part.getContent();
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                if (bodyPart.isMimeType("text/plain")) {
                    getMailTextContent(bodyPart, content);
                }
            }
        }
    }
}
